package 数据结构.conllection;

import java.util.Arrays;

/**
 * 自定义实现ArrayList    (尚不完善，remove方法有bug，当存入int时，无法被删除。没有迭代器方法)
 *
 * 可以很明显看出ArrayList在增删部分参在大量运算，而查询只需要找到索引。
 * 结论：ArrayList查询效率高，增删效率低。
 * @author huangzhi
 */

public class HzArrayList<E> {

    private Object[] elementData;
    private int size;
    private static final int DEFAULT_CAPACITY = 10;

    public HzArrayList() {
        elementData = new Object[DEFAULT_CAPACITY];
    }

    /**
     * 自定义长度
     */
    public HzArrayList(int capacity) {
        if (capacity < 0) {
            throw new NegativeArraySizeException("长度不能为负数：" + capacity);
        } else if (capacity == 0) {
            elementData = new Object[DEFAULT_CAPACITY];
        }else {
            elementData = new Object[capacity];
        }
    }

    /**
     * 添加方法
     */
    public void add(E e) {
        //数组扩容
        if (size == elementData.length) {
            //容量不够时，扩大50%.(+1是为了避免当长度为1时，无法增加长度，出现指针越界的情况)
            Object[] newArray = new Object[elementData.length + (elementData.length >> 1) + 1];
            //数据拷贝
            System.arraycopy(elementData, 0, newArray, 0, elementData.length);
            elementData = newArray;
        }

        elementData[size++] = e;
    }

    /**
     * 索引判断
     */
    public void checkIndex(int index) {
        //  长度[0,size)
        if (index < 0 || index > size - 1) {
            throw new IndexOutOfBoundsException("索引不合法：" + index);
        }
    }

    /**
     * set方法
     */
    public void set(E element, int index) {
        checkIndex(index);
        elementData[index] = element;
    }

    /**
     * get方法
     */
    public E get(int index) {
        checkIndex(index);
        return (E) elementData[index];
    }

    /**remove*/
    public void remove(E element){
        for (int i =0 ; i < size; i++) {
            if (element.equals(get(i))){
                remove(i);
            }
        }
    }

    private void remove(int index) {
        //a,b,c,d
        //a,c,d
        checkIndex(index);
        int numMoved = size - index - 1;
        if (numMoved>0) {
            //从选择元素的后一个位置开始复制，往前移动一位。移动长度为length-index-1
            System.arraycopy(elementData, index + 1, elementData, index, numMoved);
        }
        elementData[--size] = null;
    }

    public int size(){
        return size;
    }
    public boolean isEmpty() {
        return size ==0?true:false;
    }
    /**
     * 重写toString方法
     */
    @Override
    public String toString() {
        return "HzArrayList{" +
                "elementData=" + Arrays.toString(elementData) +
                ", size=" + size +
                '}';
    }

    public static void main(String[] args) {
        HzArrayList hz = new HzArrayList(1);
        hz.add("ff");
        hz.add(666);
        hz.add(7878);
        System.out.println(hz);

        hz.remove("ff");

        System.out.println(hz);

    }
}
